package top.lixunda.ecommerce.server.good.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import top.lixunda.ecommerce.server.business.IBaseConvertService;
import top.lixunda.ecommerce.server.good.api.entity.vo.GoodConvertVO;
import top.lixunda.ecommerce.server.good.api.entity.db.GoodDetailDO;
import top.lixunda.ecommerce.server.good.api.entity.db.GoodsDO;
import top.lixunda.ecommerce.server.business.api.entity.dto.PageConvertDTO;
import top.lixunda.ecommerce.server.good.api.entity.dto.GoodDetailQueryDTO;
import top.lixunda.ecommerce.server.good.api.entity.dto.StoreRelatedProductDTO;
import top.lixunda.ecommerce.server.good.mapper.GoodsMapper;

/**
 * <p>
 * VIEW 服务类
 * </p>
 *
 * @author Xumda
 * @since 2019-12-19
 */
public interface IGoodDetailService extends IBaseConvertService<GoodDetailDO,
        GoodsMapper, GoodsDO, GoodConvertVO> {

    /**
     * 用户调用，根据id获取商品数据,只能查询普通用户可见的商品信息
     *
     * @param id 商品id
     * @return 商品列表
     */
    GoodConvertVO queryById(Integer id);

    /**
     * 用户调用，根据条件筛选商品信息，只能查询普通用户可见的商品信息
     *
     * @param pageDTO 查询条件DTO, 包含查询条件，查询条件可以为空，为空时无条件进行查询
     * @return 商品列表
     */
    IPage<GoodConvertVO> queryGoodDetailByPage(
            PageConvertDTO<GoodsDO, GoodDetailDO, GoodDetailQueryDTO> pageDTO);

    /**
     * 店家调用，根据id获取商品数据,只能查询本店铺的所有商品信息
     *
     * @param id 商品id
     * @return 商品列表
     */
    GoodConvertVO queryByIdStore(Integer id);

    /**
     * 店家调用，根据条件筛选商品信息，只能查询本店铺的所有商品信息
     *
     * @param pageDTO 查询条件DTO, 包含查询条件，查询条件可以为空，为空时无条件进行查询
     * @return 商品列表
     */
    IPage<GoodConvertVO> queryGoodDetailByPageStore(
            PageConvertDTO<GoodsDO, GoodDetailDO, GoodDetailQueryDTO> pageDTO);

    /**
     * 后台管理员调用，根据id获取商品数据,查询所有商品信息
     *
     * @param id 商品id
     * @return 商品列表
     */
    GoodConvertVO queryByIdAdmin(Integer id);

    /**
     * 后台管理员调用，根据条件筛选商品信息，查询所有商品信息
     *
     * @param pageDTO 查询条件DTO, 包含查询条件，查询条件可以为空，为空时无条件进行查询
     * @return 商品列表
     */
    IPage<GoodConvertVO> queryGoodDetailByPageAdmin(
            PageConvertDTO<GoodsDO, GoodDetailDO, GoodDetailQueryDTO> pageDTO);

    /**
     * 查询新商品，分页查询，不包含条件，用户端调用
     *
     * @param pageDTO 分页数据
     * @return 商品列表
     */
    IPage<GoodConvertVO> queryNewProductsPage(
            PageConvertDTO<GoodsDO, GoodDetailDO, ?> pageDTO);

    /**
     * 查询某个店铺中的最新的商品的商品，用户端调用，不包含条件
     *
     * @param pageDTO 分页数据，不包含条件
     * @return 商品列表
     */
    IPage<GoodConvertVO> queryStoreRelatedProductPage(
            PageConvertDTO<GoodsDO, GoodDetailDO, StoreRelatedProductDTO> pageDTO);


}
